package com.tom.demo.service.common.impl;

import com.tom.demo.common.entity.FileResponse;
import com.tom.demo.common.exception.CustomException;
import com.tom.demo.service.common.FileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;

@Slf4j
@Service
public class FileServiceImpl implements FileService {

    @Value(value = "${file.url}")
    private String target;

    @Override
    public FileResponse storageFile(MultipartFile multipartFile, HttpServletRequest httpServletRequest) {
            FileResponse fileResponse = new FileResponse();
            if (Objects.nonNull(multipartFile)) {
                //获取文件类型(image/png)
                fileResponse.setFileType(multipartFile.getContentType());
                //获取文件大小
                fileResponse.setFileSize(multipartFile.getSize());
                // 获取文件原始名称
                String originalFileName = multipartFile.getOriginalFilename();
                fileResponse.setFileName(originalFileName);
                String suffix = "";
                // 获取文件后缀名称
                if (StringUtils.hasText(originalFileName)) {
                    //获取原始文件名称的后缀(.jpg) ,从最后一个小数点截取到末尾
                    suffix = originalFileName.substring(originalFileName.lastIndexOf("."));
                }
                String newFileName = System.currentTimeMillis() + UUID.randomUUID().toString().replaceAll("-", "") + suffix;
                File targetFile = new File(target);
                if(!targetFile.exists()){
                    boolean exists = targetFile.exists();
                    if(exists){
                        log.info("文件夹已存在");
                    }else {
                        log.info("文件夹不存在");
                        boolean mkdirs = targetFile.mkdirs();
                        if(mkdirs){
                            log.info("创建文件夹成功");
                        }else {
                            log.error("创建文件夹失败");
                            return null;
                        }
                    }
                }
                try {
                    //1:使用File类
                    String savePath = targetFile.getPath() + File.separator + newFileName;
                    File saveFile = new File(savePath);
                    //保存文件到磁盘上面
                    FileCopyUtils.copy(multipartFile.getBytes(),saveFile);

                    // .\file\imgDir 替换第一个. 替换完之后是\file\imgDir\2023-04-28 （windows）
                    String path = targetFile.getPath().replaceFirst(".","");
                    // 拼接之后是 \file\img\2023-04-28\1682663086579733b4afd7d19447fac49596a3f10fae4.jpg
                    String fileDownloadUri = path + File.separator + newFileName;
                    // 前缀 prefix=10.204.220.101:8080/system
                    String prefix = "http://" +  httpServletRequest.getServerName() + ":" + httpServletRequest.getServerPort() + httpServletRequest.getContextPath();
                    //返回给前端图片保存路径，前台可以根据返回的路径拼接完整地址，可在浏览器上面预览该图片
                    //如果不是图片的话，这个地址访问之后，直接就可以下载
                    if(fileDownloadUri.contains("\\")){
                        //将所有的windows \ 换成 / 以免Linux不支持
                        String replace = fileDownloadUri.replace("\\", "/");
                        fileResponse.setFileDownloadUri(prefix + replace);
                    }else {
                        fileResponse.setFileDownloadUri(prefix + fileDownloadUri);
                    }
                } catch (IOException e) {
                    log.error("文件保存失败");
                    throw new RuntimeException(e);
                }
            }
            return fileResponse;
    }

}
